CloudFrontのCNAMEAlreadyExistsエラーを解決するフローチャート(2021年夏版)
Amazon CloudFrontはディストリビューション間のCNAMEの重複が許可されていません(CNAMEAlreadyExists エラー)。
この CNAMEAlreadyExists エラーを回避するために
- ユーザー自身で回避する方法
- AWSサポートと連携して回避する方法
など、様々なアプローチが存在します。
最近のCloudFrontの仕様変更、API追加により、ユーザー自身で回避できるケースが大幅に増えましたので、最新のパターン別の回避方法を紹介します。
回避フロー
重複対象のディストリビューションを調査
CNAMEAlreadyExists エラーの原因となったディストリビューションがどこに存在するのか知りたい時があります。
そのような場合は CloudFront::ListConflictingAliases API を利用します。
指定したCNAME(エイリアス)とオーバーラップしたCNAMEを持つディストリビューションの
- AWSアカウントID
- ディストリビューションID
情報を一部「*」でマスクされた状態で取得できます。 レスポンスに「AWSアカウントID」が含まれていることからわかるように、AWSアカウントをまたいだ情報を取得します。
重複の原因となるディストリビューションを特定し、CNAMEを付け替えてもよいか確認しましょう。
検索条件にワイルドカード型のCNAMEを利用すると、サブドメインの深さが同じCNAMEの一覧を抽出できます。
# ワイルドカードエイリアスを指定 $ aws cloudfront list-conflicting-aliases \ --distribution-id XXX \ --alias '*.example.co' { "ConflictingAliasesList": { "MaxItems": 100, "Quantity": 3, "Items": [ { "Alias": "www.example.co", "DistributionId": "******QB925RI", "AccountId": "******111111" }, { "Alias": "*.example.co", "DistributionId": "*******7XRY8HY", "AccountId": "******111111" }, { "Alias": "dummy.example.co", "DistributionId": "*******9NZA14E", "AccountId": "******222222" } ] } } # 明示的なエイリアスを指定 $ aws cloudfront list-conflicting-aliases \ --distribution-id YYY \ --alias 'www.example.co' { "ConflictingAliasesList": { "MaxItems": 100, "Quantity": 2, "Items": [ { "Alias": "www.example.co", "DistributionId": "******QB925RI", "AccountId": "******111111" }, { "Alias": "*.example.co", "DistributionId": "*******7XRY8HY", "AccountId": "******111111" } ] } }
アカウントIDとディストリビューションIDの前半部分が「*」でマスクされています。 これはブログ向けの加工ではなく、API のレスポンスそのままです。
過去には、ワイルドカード形式のCNAME(*.example.com)を設定すると、他のAWSアカウントで重複(CNAMEAlreadyExists)エラーが発生してCNAMEを指定できないという制約がありましたが、現在はなくなっています。
より気楽にワイルドカードCNAMEを利用できるようになりました。
CloudFront::AssociateAlias API でアトミックに付け替え
- ディストリビューションが属するAWSアカウントが同じ
- ディストリビューションが属するAWSアカウントが別で移行元の状態がdisabled
の場合、CloudFront::AssociateAlias API を利用することで、ダウンタイム無しにアトミックにCNAMEを付け替えられます。
以下の流れで作業します。
- DNS TXTレコードを作成し、ドメインと移行先ディストリビューションの所有者であることを示す
- CloudFront::AssociateAlias API を実行
詳細は以下のドキュメントを参照ください。
- Use associate-alias to move an alternate domain name - Amazon CloudFront
- CloudFrontのCNAMEをディストリビューション間でダウンタイム無しにアトミックに移行できるようになりました | DevelopersIO
ワイルドカードCNAMEを経由して付け替え
- ディストリビューションが属するAWSアカウントが別で対象のCNAMEが非APEX形式
の場合、ワイルドカード型のCNAMEを経由して付け替えられます。
切り替えのタイミングをユーザーがコントロールできる一方で、手順は少し複雑です。
以下の流れで作業します。
- 移行先ディストリビューションのCNAMEをワイルドカード形式(*.example.com)で指定
- 移行元ディストリビューションのCNAMEから移行するCNAME(www.example.com)を削除
- 移行先ディストリビューションのCNAMEをワイルドカード形式(*.example.com)から具体的なもの(www.example.com)に変更
詳細は以下のドキュメントを参照ください。
- Use a wildcard to move an alternate domain name - Amazon CloudFront
- https://dev.classmethod.jp/articles/swap-cname-between-cloudfront-distribution/#toc-2
AWSサポートと連携
クロスアカウントにAPEX CNAMEを付け替える場合、AWSと協調します。
この場合、ユーザーは切り替えタイミングをコントロールできません。
以下の流れで作業します。
- ユーザーがDNS TXTレコードを作成し、ドメインと移行先ディストリビューションの所有者であることを示す
- AWSがディストリビューション間のCNAMEの付け替えを行う
実質的に、「CloudFront::AssociateAlias API でアトミックに付け替え」のケースにおいて、CNAMEの付け替え者がユーザーからAWSに変わっただけです。
詳細は以下のドキュメントを参照ください。
最後に
Amazon CloudFrontの CNAMEAlreadyExists エラーの回避方法を3パターン紹介しました。
アトミックな付替えAPIの誕生、ワイルドカードCNAMEの制約の軽減などにより、ユーザー自身で回避できるケースが増えました。
AWSアカウントをまたいだディストリビューションを取得する CloudFront::ListConflictingAliases API は一部情報がマスクされていたり、 CNAMEを付け替える CloudFront::AssociateAlias API はACTIVEな移行元ディストリビューションを付け替えられないことなどから、 AWSはクロスアカウント向けの操作には慎重な姿勢が伺えます。
クロスアカウントでも API一発でアトミックにCNAME置換できるようになるのを気長に待ちたいと思います。
それでは。